package jvm.VMExecSubsystem;

import java.io.Serializable;

public class Overload {
//    public static void sayHello(Object arg){
//        System.out.println("hello Object");
//    }

//    public static void sayHello(int arg){
//        System.out.println("hello int");
//    }

//    public static void sayHello(long arg){
//        System.out.println("hello long");
//    }

//    public static void sayHello(Character arg){
//        System.out.println("hello Character");
//    }

//    public static void sayHello(char arg){
//        System.out.println("hello char");
//    }

    public static void sayHello(char... arg){
        System.out.println("hello char...");
    }

//    public static void sayHello(Serializable arg){
//        System.out.println("hello Serializable");
//    }

    public static void main(String[] args) {
        sayHello('a');
    }
}

/**
 * 结果： hello char --> 屏蔽掉char --> hello int --> 屏蔽掉 int --> hello long --> 屏蔽掉 long --> hello Character --> 屏蔽掉 Character
 *  -->hello Serializable -->屏蔽 Serializable --> hello Object --> 屏蔽掉 Object --> hello char... --> 屏蔽掉 char... -->不能运行
 *
 *  结论： 向上自动转型的顺序是 char >int > long > float> double . char类型的数据不能隐式转换成 byte和short类型，这是不安全的。
 *  转换的顺序如上面的结果所示。
 *  匹配顺序:
 *      1.首先找参数类型为char的重载方法。
 *      2.找不到就会自动转型，顺序为 char >int > long > float> double
 *      3.还找不到就会将其变成封装类 Character，
 *      4.还找不到就会将其变成封装类 Character的一个接口 Serializable ：注意 char可以自动向上转型为int但是Character不能转型成为Integer， 它只会转型称为父接口。
 *          该类实现了两个接口 Serializable, Comparable<Character>,注意如果在重载中同时由这两种类型的重载方法，javac会拒绝编译并提示"类型模糊(Type Ambiguous)".
 *          这是程序必须显示的指明变量静态类型如 sayHello((Comparable<Character>) 'a');但是这仅仅是无法编译，如果你可以绕过这个编译过程(比如自己写字节码)。
 *          这个字节码文件是可以运行的，只是不知道它的结果是Serializable还是 Comparable<Character>，这是《java虚拟机规范》中允许出现的情况。
 *      5.还找不到就会向上找其父类。越顶层的父类优先级越低。
 *      6.还找不到就只会匹配可变参数了 char... 这个方法的优先级是最低的。
 */
